home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 1.iso
/
ARGONET
/
PD
/
MATHS
/
RLAB
/
RLAB125.ZIP
/
!RLaB
/
toolbox
/
spectrogra
< prev
next >
Wrap
Text File
|
1995-02-25
|
2KB
|
74 lines
//-------------------------------------------------------------------//
// Synopsis: Compute the short-time periodic windowed FFT of a signal.
// Syntax: spectrogram ( SEQ, FRAMESIZE, NOVERLAP )
// spectrogram ( SEQ, FRAMESIZE, NOVERLAP, ZEROPAD )
// Description:
// For each frame, window it with a Hanning window, compute the
// FFT, remove the negative frequencies, and take the log of
// the resulting elements. Then hop ahead by (FRAMESIZE -
// NOVERLAP) elements to the next frame.
// If the ZEROPAD argument is supplied, that many zeros are
// appended to the frame before computing the FFT.
// ZEROPAD + FRAMESIZE should be a power of two.
// The resulting array has (FRAMESIZE+ZEROPAD)/2 rows and a
// number of columns determined by the framesize and overlap
// values. Low frequencies come first, i.e. they have low row
// indices.
// Sample seq: seq = readb("somedatafile.rb");
// spect = spectrogram(seq, 512, 0);
// plmesh(<< x=1:spect.nr; y=1:spect.nc; z=spect >>);
// This file is a translation of spectrogram.m from the Osprey toolbox.
// The results of this function may differ from Matlab's slightly
// since the Hanning window is computed differently.
require window
//-------------------------------------------------------------------//
spectrogram = function (seq, frameSize, nOverlap, zeroPad)
{
local (seq, frameSize, nOverlap, zeroPad)
if (!exist (zeroPad)) { zeroPad = 0; }
inrows = seq.nr;
incols = seq.nc;
if (inrows != 1 && incols != 1)
{
error ("Spectrogram requires a 1-dimensional sequence");
}
nfft = frameSize + zeroPad;
seqsize = max (inrows, incols);
outcols = floor(1 + (seqsize - frameSize) / (frameSize - nOverlap));
outrows = nfft / 2;
result = zeros (outrows, outcols);
// column vector
win = window (frameSize, "hann");
for (i in 1:outcols)
{
start = 1 + (frameSize - nOverlap) * (i - 1);
frame = reshape (seq[start:(start + frameSize - 1)], frameSize, 1);
// column vector
spectrum = fft (frame .* win, nfft);
result[;i] = spectrum [1:outrows];
}
// move inside loop if memory problems
result = log (abs (result));
return result;
};